package com.zjsru.plan2025.oneday;

import java.util.Arrays;
import java.util.List;

/**
 * 624. 数组列表中的最大距离
 *
 * @Author: cookLee
 * @Date: 2025-02-19
 */
public class MaxDistance {

    /**
     * 主
     * 现在你需要从两个不同的数组中选择两个整数（每个数组选一个）并且计算它们的距离。两个整数 a 和 b 之间的距离定义为它们差的绝对值 |a-b| 。
     * \
     * 输入：[[1,2,3],[4,5],[1,2,3]]
     * 输出：4
     * 解释：
     * 一种得到答案 4 的方法是从第一个数组或者第三个数组中选择 1，同时从第二个数组中选择 5 。
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        MaxDistance maxDistance = new MaxDistance();
        List<Integer> list1 = Arrays.asList(1);
        List<Integer> list2 = Arrays.asList(4, 5);
        List<Integer> list3 = Arrays.asList(1, 2, 3);
        List<List<Integer>> arrays = Arrays.asList(list1, list2, list3);
        System.out.println(maxDistance.maxDistance2(arrays));
    }

    /**
     * 双循环-会超时
     *
     * @param arrays 阵列
     * @return int
     */
    public int maxDistance(List<List<Integer>> arrays) {
        int ans = 0;
        for (int i = 0; i < arrays.size(); i++) {
            //每个数组按照升序排列
            int mn = arrays.get(i).get(0);
            int mx = arrays.get(i).get(arrays.get(i).size() - 1);
            for (int j = i + 1; j < arrays.size(); j++) {
                if (i != j) {
                    //取绝对值，最小的数减最大的数即可
                    ans = Math.max(ans, Math.abs(mn - arrays.get(j).get(arrays.get(j).size() - 1)));
                    ans = Math.max(ans, Math.abs(arrays.get(j).get(0) - mx));
                }
            }
        }
        return ans;
    }

    public int maxDistance2(List<List<Integer>> arrays) {
        //默认获取第一个数组的最大最小值 存入去比较
        int max = arrays.get(0).get(arrays.get(0).size() - 1);
        int min = arrays.get(0).get(0);
        int ans = 0;
        for (int i = 1; i < arrays.size(); i++) {
            List<Integer> arr = arrays.get(i);
            Integer mn = arr.get(0);
            Integer mx = arr.get(arr.size() - 1);
            //维护最大值减去最小值，取其中最大的作为最大差值
            ans = Math.max(ans, Math.max(mx - min, max - mn));
            max = Math.max(max, mx);
            min = Math.min(min, mn);
        }
        return ans;
    }

}
